import * as THREE from 'three';

class AnimationController {
    constructor(model) {
        this.mixer = new THREE.AnimationMixer(model);
        this.actions = new Map();     // 使用Map存储动画动作
        this.clips = new Map();       // 存储动画剪辑
        this.currentAnimation = null; // 当前播放的动画
        this.clock = new THREE.Clock();
    }

    /**
     * 添加动画剪辑
     * @param {THREE.AnimationClip|Array<THREE.AnimationClip>} clips 动画剪辑或数组
     */
    addClips(clips) {
        const clipArray = Array.isArray(clips) ? clips : [clips];

        clipArray.forEach(clip => {
            this.clips.set(clip.name, clip);
            const action = this.mixer.clipAction(clip);
            action.setLoop(THREE.LoopOnce).clampWhenFinished = true;
            this.actions.set(clip.name, action);
        });
    }

    /**
     * 播放动画
     * @param {string} name 动画名称
     * @param {Object} [options] 配置选项
     * @param {number} [options.fadeTime=0.3] 淡入淡出时间(秒)
     * @param {boolean} [options.loop=false] 是否循环
     * @param {boolean} [options.reset=true] 是否重置
     */
    play(name, { fadeTime = 0.3, loop = false, reset = true } = {}) {
        if (!this.actions.has(name)) {
            console.warn(`动画"${name}"不存在`);
            return;
        }

        // 淡出当前动画
        if (this.currentAnimation) {
            this.actions.get(this.currentAnimation).fadeOut(fadeTime);
        }

        // 设置新动画
        const action = this.actions.get(name);
        if (reset) action.reset();
        action.setLoop(loop ? THREE.LoopRepeat : THREE.LoopOnce);
        action.fadeIn(fadeTime).play();

        this.currentAnimation = name;
    }

    /**
     * 停止所有动画
     * @param {number} [fadeTime=0.3] 淡出时间
     */
    stopAll(fadeTime = 0.3) {
        this.actions.forEach(action => action.fadeOut(fadeTime));
        this.currentAnimation = null;
    }

    /**
     * 设置动画进度(0-1)
     * @param {string} name 动画名称
     * @param {number} progress 进度值
     */
    setProgress(name, progress) {
        const clip = this.clips.get(name);
        const action = this.actions.get(name);

        if (clip && action) {
            action.time = progress * clip.duration;
            this.mixer.update(0); // 强制更新
        }
    }

    /**
     * 更新动画系统(需要在渲染循环中调用)
     */
    update() {
        this.mixer.update(this.clock.getDelta());
    }

    /**
     * 动画事件监听
     * @param {string} name 动画名称
     * @param {Function} callback 回调函数
     */
    onFinish(name, callback) {
        const action = this.actions.get(name);
        if (!action) return;

        const listener = e => {
            if (e.action === action) {
                callback();
                this.mixer.removeEventListener('finished', listener);
            }
        };
        this.mixer.addEventListener('finished', listener);
    }

    /**
     * 获取动画列表
     * @returns {Array<string>} 动画名称数组
     */
    getAnimationList() {
        return Array.from(this.clips.keys());
    }
}

export default AnimationController;